﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tanmia.Basis.Core;

namespace Tanmia.Warehouse.Core
{
    /// <summary>
    /// بطاقة المادة
    /// </summary>
    public class Item : BaseBusinessObject, IMovableElement, ICategorizable
    {
        private string description;
        private string itemBarcode;
        private bool stopInput;
        private bool stopOutput;
        private bool balanceExceeding;
        private double minimum;
        private double maximum;
        private MovingApproach movingApproach;
        private IList<ItemUnit> itemUnits;
        private ItemCategory category;

        /// <summary>
        /// وصف المادة
        /// </summary>
        public virtual string Description
        {
            get { return description; }
            set { SetValue<string>("Description", ref description, value); }
        }

        /// <summary>
        /// باركود ثابت لكل قطع المادة مهما كانت الطريقة التي تتحرك بها
        /// </summary>
        public virtual string ItemBarcode
        {
            get { return itemBarcode; }
            set { SetValue<string>("ItemBarcode", ref itemBarcode, value); }
        }

        /// <summary>
        /// إيقاف إدخال المادة
        /// </summary>
        public virtual bool StopInput
        {
            get { return stopInput; }
            set { SetValue<bool>("StopInput", ref stopInput, value); }
        }

        /// <summary>
        /// إيقاف إخراج المادة
        /// </summary>
        public virtual bool StopOutput
        {
            get { return stopOutput; }
            set { SetValue<bool>("StopOutput", ref stopOutput, value); }
        }

        /// <summary>
        /// السماح بتخطي رصيد المادة
        /// </summary>
        public virtual bool BalanceExceeding
        {
            get { return balanceExceeding; }
            set { SetValue<bool>("BalanceExceeding", ref balanceExceeding, value); }
        }

        /// <summary>
        /// الحد الأدنى للمادة
        /// </summary>
        public virtual double Minimum
        {
            get { return minimum; }
            set { SetValue<double>("Minimum", ref minimum, value); }
        }

        /// <summary>
        /// الحد الأعلى للمادة
        /// </summary>
        public virtual double Maximum
        {
            get { return maximum; }
            set { SetValue<double>("Maximum", ref maximum, value); }
        }

        /// <summary>
        /// طريقة تحريك المادة
        /// </summary>
        public virtual MovingApproach MovingApproach
        {
            get { return movingApproach; }
            set { SetValue<MovingApproach>("MovingApproach", ref movingApproach, value); }
        }

        /// <summary>
        /// التصنيف الذي تتبع له المادة
        /// </summary>
        public virtual ItemCategory Category
        {
            get { return category; }
            set { SetValue<ItemCategory>("Category", ref category, value); }
        }

        /// <summary>
        /// وحدات القياس المعتمدة للمادة
        /// </summary>
        public virtual IList<ItemUnit> ItemUnits
        {
            get { return itemUnits; }
            set { SetValue<IList<ItemUnit>>("ItemUnites", ref itemUnits, value); }
        }

        #region IMovableElement Members
        private int elementID;

        /// <summary>
        /// رقم تعريف المادة
        /// </summary>
        public virtual int ElementID
        {
            get { return elementID; }
            set { SetValue<int>("ElementID", ref elementID, value); }
        }

        #endregion

        #region ICategorizable Members

        private string name;
        private string engName;
        private string code;
        private string number;

        /// <summary>
        /// اسم المادة
        /// </summary>
        public virtual string Name
        {
            get { return name; }
            set { SetValue<string>("Name", ref name, value); }
        }

        /// <summary>
        /// الاسم الأجنبي للمادة
        /// </summary>
        public virtual string EngName
        {
            get { return engName; }
            set { SetValue<string>("EngName", ref engName, value); }
        }

        /// <summary>
        /// رمز المادة
        /// </summary>
        public virtual string Code
        {
            get { return code; }
            set { SetValue<string>("Code", ref code, value); }
        }

        /// <summary>
        /// رقم المادة
        /// </summary>
        public virtual string Number
        {
            get { return number; }
            set { SetValue<string>("Number", ref  number, value); }
        }

        #endregion
    }
}
